package de.fhffm.gui;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.swing.table.AbstractTableModel;

import de.fhffm.tables.Duenger;

@SuppressWarnings("serial")
public class DuengerTableModel extends AbstractTableModel {

	private EntityManager manager = Persistence.createEntityManagerFactory("test").createEntityManager(); 
	private int startPosition;
	private List<Duenger> duengerListe;
	private int zaehler = 0;
	
	DuengerTableModel(){
		this.startPosition = 0;
		// hohle alle Pflanzen zwischen 0 und 100
		this.duengerListe = getItems(startPosition, startPosition+100);
		
	}


	@Override
	public int getRowCount() {
		// gibt Zeilenanzahl als Long wert zurück
		return ((Long) manager.createQuery("SELECT COUNT(c) FROM Duenger c").getSingleResult()).intValue();
	}

	@Override
	public int getColumnCount() {
		return 6;
	}
	
    public String getColumnName(int spalte) {
        
    	switch(spalte) {
            case 0:
                return "ID";
            case 1:
                return "Marke";
            case 2:
            	return "Kalium";
            case 3:
            	return "Magnesium";
            case 4:
            	return "Phosphat";
            case 5:
            	return "Stickstoff";
            default:
                return "DEFAULT";
        }
    }

	@Override
	public Object getValueAt(int zeilenIndex, int spaltenIndex) {
		
		if((zeilenIndex >= startPosition) && (zeilenIndex < (startPosition+100))){
			/* Wenn die Zeile in dem vorher definierten Bereich liegt (standart ist 0-100)
			 * dann tuhe nix!
			 */
			
		}else {
			
			/*
			 * Falls die ausgewaehlte Zeile drueber liegt dan wird der Bereich neu gesetzt
			 * und die jeweiligen Items in diesem neuen bereich gehohlt
			 */
			this.duengerListe = getItems(zeilenIndex,zeilenIndex+100);
			this.startPosition = zeilenIndex;
		}
		
		Duenger d;
		
		try{
		 d = duengerListe.get(zeilenIndex-startPosition);
		}catch(ArrayIndexOutOfBoundsException e){
			
			this.duengerListe = getItems(startPosition, startPosition+100);
			d = duengerListe.get(zeilenIndex-startPosition);
			
		}
		

		
		Object toReturn = null;
		
		switch(spaltenIndex){
		case 0:
			toReturn = d.getDuengerID();
			break;
		case 1:
			toReturn = d.getDuengerMarke();
			break;
		case 2:
			toReturn = d.getKalium();
			break;	
		case 3:
			toReturn = d.getMagnesium();
			break;
		case 4:
			toReturn = d.getPhosphat();
			break;
		case 5:
			toReturn = d.getStickstoff();
			break;

		default:
			toReturn = d.getDuengerID();
			
		}
		return toReturn;
	
		
	}
	
	private List<Duenger> getItems(int von, int bis) {
		System.out.println("number of requests to the database"+zaehler++);
		Query query = manager.createQuery("SELECT d FROM Duenger d").setMaxResults(bis-von).setFirstResult(von);
		
		List<Duenger> resultList = query.getResultList();
		return resultList;
	}

}
